#ifndef __BACKTRACE_H__
#define __BACKTRACE_H__

#include <string>
#include <vector>
#include <assert.h>
#include <iostream>


//获取当前的调用栈
//bt 保存调用栈
//size 最多返回层数
//skip 跳过栈顶的层数
void Backtrace(std::vector<std::string>& bt, int size = 64, int skip = 1);

//获取当前栈信息的字符串
//size 栈的最大层数
//skip 跳过栈顶的层数
//prefix 栈信息前输出的内容
std::string BacktraceToString(int size = 64, int skep = 2, const std::string& prefix = "");



//断言宏封装
#define ASSERT(x) \
    if((!(x))) {   \
        std::cout << "ASSERTION: " #x \
            << "\nbacktrace:\n" /*回溯跟踪*/   \
            << BacktraceToString(100, 2, "\t"); \
        assert(x); \
    }   

//断言宏封装
#define ASSERT2(x, w)  \
    if((!(x))) {  \
        std::cout << "ASSERTION " #x \
            << "\n" << w  \
            << "\nbacktrace:\n" /*回溯跟踪*/   \
            << BacktraceToString(100, 2, "\t"); \
        assert(x); \
    }

#endif